"use strict";
// 练习2
// 实现一个依赖类和响应区函数，
// 使得当任意进入响应式空间的函数都能作为依赖被收集
// 被收集的依赖相当于是被订阅，当依赖类的状态更新时
// 依赖类应该可以提醒并激活所有的订阅者更新所有的状态
var __spreadArrays = (this && this.__spreadArrays) || function () {
    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
    for (var r = Array(s), k = 0, i = 0; i < il; i++)
        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
            r[k] = a[j];
    return r;
};
// 标记正在运行的函数
var isRunning;
// 依赖类定义
var Dependency = /** @class */ (function () {
    function Dependency() {
        this.subscribers = new Set();
    }
    // 表明某段runtime代码被依赖
    Dependency.prototype.depend = function () {
        if (isRunning) {
            this.subscribers.add(isRunning); // 订阅当前的依赖函数
        }
    };
    // 表明某段runtime代码的依赖被触发，代码执行
    Dependency.prototype.notify = function () {
        this.subscribers.forEach(function (func) {
            func(dep);
        }); // 执行当前的依赖
    };
    return Dependency;
}());
var dep = new Dependency(); // 依赖对象
// 响应式空间
function reactivity(func) {
    var args = [];
    for (var _i = 1; _i < arguments.length; _i++) {
        args[_i - 1] = arguments[_i];
    }
    console.log("reactivity是响应式空间，目前处于反应区。");
    // 追踪依赖的函数
    function traceFunc() {
        isRunning = traceFunc; // 标记正在进行的函数
        dep.depend(); // 收集当前依赖
        func.apply(void 0, __spreadArrays([dep], args));
        isRunning = null;
    }
    traceFunc(); // 重新执行函数
}
// 测试用例
var quantity = 10;
var price = 10;
var total = 0;
var calPrice = function () { return total = quantity * price; };
reactivity(calPrice);
console.log(total); // 100
price = 20;
console.log(total); // 100
dep.notify(); // 更新当前依赖状态
console.log(total); // 200
